package com.hl.springboot4.controller;

import com.hl.springboot4.util.R;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * @ClassName FileController
 * @Description TODO
 * @Author libowen
 * @Date 2025年03月03日 14:24
 * @Version 1.0
 */
@RestController
@RequestMapping("file")
//@CrossOrigin
public class FileController {
    // 定义一个全局的路径
    private String rootPath = "D:/upload/";

    // 定义一个公共的预览图片  IO流
    @RequestMapping("downLoad")
    public void downLoad(String fileName, HttpServletResponse response) throws IOException {
        // 文件名 202503/0ca12d3437884b0fa6a1dec824c15985-aa.jpg
        // 1.获取文件的文件流对象
        FileInputStream fin = new FileInputStream(new File(rootPath,fileName));
        // 2.设置响应的类型
        response.setHeader("Content-Disposition", "filename="+fileName);//预览
        // 3.获取响应流对象
        ServletOutputStream out = response.getOutputStream();
        // 4.进行文件的拷贝--读写操作
        IOUtils.copy(fin,out);
        // 5.关闭资源
        out.close();
        fin.close();
    }

    @RequestMapping("downLoad2")
    public void downLoad2(String fileName, HttpServletResponse response) throws IOException {
        // 文件名 202503/0ca12d3437884b0fa6a1dec824c15985-aa.jpg
        // 1.获取文件的文件流对象
        FileInputStream fin = new FileInputStream(new File(rootPath,fileName));
        // 2.设置响应的类型
        response.setHeader("Content-Disposition", "attachment;filename="+fileName);//下载
        // 3.获取响应流对象
        ServletOutputStream out = response.getOutputStream();
        // 4.进行文件的拷贝--读写操作
        IOUtils.copy(fin,out);
        // 5.关闭资源
        out.close();
        fin.close();
    }

    //定义一位上传文件的接口
    @PostMapping("upload")
    public R upload(MultipartFile file) throws IOException { // vue中默认提交的名称为file
        // 1.判断文件是否为空
        if(file.isEmpty()){
            return R.fail("文件不能为空");
        }
        // 2.获取文件名
        String fileName = file.getOriginalFilename();
        // 3.处理上传后的文件的名称的唯一性
        fileName  = UUID.randomUUID().toString().replace("-","")+"-"+ fileName;
        // 一般使用时间的年+月组成文件夹名
        SimpleDateFormat format = new SimpleDateFormat("yyyyMM");
        String dirName = format.format(new Date());
        // 判断文件夹是否存在，如果不存在，则创建
        File dirFile = new File(rootPath,  dirName);
        if(!dirFile.exists()){
            dirFile.mkdirs();  // 创建文件夹
        }
        // 4.上传 -- IO流
        file.transferTo(new File(dirFile,fileName));
        // 5.返回结果
        // 获取上传后的真正的文件路径(不包含 d:/upload),最中把真实路径放入到数据库中即可
        String realPath = dirName+"/"+fileName;
        return R.ok(realPath);
        // 日期/文件名    202503/jdsuoyorenwlxdfuodsf-aa.jpg
    }


}
